import axios from 'axios'
import { ElMessage } from 'element-plus'
import router from '@/router'

// 创建axios实例
const service = axios.create({
  baseURL: import.meta.env.VITE_API_URL || 'http://localhost:8080',
  timeout: 120000 // 增加到120秒，确保大模型API调用有足够的响应时间
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 尝试不同的token名称
    const token = localStorage.getItem('token') || 
                  localStorage.getItem('accessToken') || 
                  localStorage.getItem('authToken') || 
                  localStorage.getItem('jwtToken')
    
    if (token) {
      // 添加详细日志，帮助调试认证问题
      console.log('使用令牌：', token.substring(0, 10) + '...');
      console.log('请求URL：', config.url);
      
      // 检查token格式，确保正确添加Bearer前缀
      if (token.startsWith('Bearer ')) {
        config.headers['Authorization'] = token;
      } else {
        config.headers['Authorization'] = `Bearer ${token}`;
      }
      
      // 为所有媒体资源请求添加时间戳，避免缓存问题
      if (config.url && (config.url.includes('/media-resources/') || config.url.includes('/video/'))) {
        const separator = config.url.includes('?') ? '&' : '?';
        config.url = `${config.url}${separator}t=${Date.now()}`;
        
        // 确保每个媒体资源请求都配置了正确的responseType
        if (config.url.includes('/video/') && !config.responseType) {
          config.responseType = 'blob';
        }
      }
    } else {
      console.warn('未找到认证令牌，请求可能会被拒绝:', config.url);
    }
    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 添加详细日志，帮助调试
    console.log(`请求成功 [${response.config.method.toUpperCase()}] ${response.config.url}`);
    return response
  },
  error => {
    console.error('响应错误:', error)
    if (error.response) {
      // 打印更详细的错误信息
      console.error(`API错误 [${error.response.status}] [${error.config?.method?.toUpperCase()}] ${error.config?.url}`);
      console.error('错误详情:', error.response.data);
      
      switch (error.response.status) {
        case 401:
          // 对于媒体资源请求，不显示错误消息，让组件自行处理
          if (error.config?.url && (error.config.url.includes('/media-resources/') || error.config.url.includes('/video/'))) {
            console.warn('媒体资源请求认证失败:', error.config.url);
            // 不弹出错误提示，也不清除令牌和跳转
            return Promise.reject(error);
          }
          
          ElMessage.error('登录已过期或未授权，请重新登录')
          // 401错误时，检查令牌是否存在
          if (localStorage.getItem('token')) {
            console.warn('令牌存在但仍然返回401错误，可能是令牌已过期或格式不正确');
            // 清除本地存储的认证信息
            localStorage.removeItem('token');
            localStorage.removeItem('teacherId');
            localStorage.removeItem('teacherName');
            localStorage.removeItem('tokenExpireTime');
            // 重定向到登录页
            router.push('/login');
          } else {
            console.warn('未找到令牌，请先登录');
            router.push('/login');
          }
          break
        case 403:
          ElMessage.error('没有权限访问该资源')
          break
        case 404:
          ElMessage.error('请求的资源不存在')
          break
        case 500:
          ElMessage.error('服务器错误，请稍后重试')
          break
        default:
          ElMessage.error(error.response.data?.message || '请求失败')
      }
    } else {
      ElMessage.error('网络错误，请检查网络连接')
    }
    return Promise.reject(error)
  }
)

export default service 